/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controleur;

import exception.DivisionByZeroException;
import exception.FonctionNonDefinieException;
import exception.NbParametresIncorrectException;
import exception.TexteVideException;
import exception.VariableNonDeclareeException;
import generation.GestionFonctions;
import generation.GestionVariables;
import generation.ParseException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import librairies.ModelJTableVariable;
import java.io.InputStream;
import java.util.Map;
import vue.VueInterpreteur;

/**
 *
 * @author FM & KB
 */
public class Controleur implements ActionListener {

    private VueInterpreteur vue;
    private Programme programme;
    private ModelJTableVariable model_variable;

    public Controleur(VueInterpreteur vue, Programme programme) {
        this.vue = vue;
        this.programme = programme;
        model_variable = new ModelJTableVariable();
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        String ac = ae.getActionCommand();
        if (ac.equals(VueInterpreteur.MENU_EXIT)) {
            vue.exit();
        } else if (ac.equals(VueInterpreteur.MENU_OPEN_FILE)) {
            vue.ouvrirProgramme();
        } else if (ac.equals(VueInterpreteur.BTN_EXECUTE)) {
            vue.clear();
            parseAndExecuteProgram();
        }
    }

    private void parseAndExecuteProgram() {
        String texte = vue.getTextProgramme();
        try {
            if (texte.equals("")) {
                throw new TexteVideException();
            }
            InputStream is = new ByteArrayInputStream(texte.getBytes());
            GestionVariables.reinitialiser();
            GestionFonctions.reinitialiser();
            programme.parse(is);
            //exécution du programme
            executeProgram();
        } catch (FileNotFoundException fnfe) {
            vue.afficherErreur(fnfe.getMessage());
        } catch (FonctionNonDefinieException fnde) {
            vue.afficherErreur(fnde.getMessage());
        } catch (VariableNonDeclareeException vnde) {
            vue.afficherErreur(vnde.getMessage());
        } catch (DivisionByZeroException dbze) {
            vue.afficherErreur(dbze.getMessage());
        } catch (ParseException pe) {
            vue.afficherErreur(pe.getMessage());
        } catch (TexteVideException te) {
            vue.afficherErreur(te.getMessage());
        } catch (ClassCastException ce){
            vue.afficherErreur(ce.getMessage());
        }
    }

    private void executeProgram() {
        try {
            programme.executer();
        } catch (FonctionNonDefinieException ex) {
            vue.afficherErreur(ex.getMessage());
        } catch (NbParametresIncorrectException ex) {
            vue.afficherErreur(ex.getMessage());
        } catch (VariableNonDeclareeException ex) {
            vue.afficherErreur(ex.getMessage());
        } catch (DivisionByZeroException ex) {
            vue.afficherErreur(ex.getMessage());
        }
        //On met à jour l'affichage des valeurs des variables dans la vue
        Map<String, Integer> valeurs = GestionVariables.listeVariables();
        model_variable.remplir(valeurs);
        vue.majAffichageVariable(model_variable);
        //vue.ajouterLigneConsole("Arbre correspondant :\n " + programme.notationExplorateur("") + "\n", Color.BLACK);
        //vue.ajouterLigneConsole(programme.);
    }
}
